home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / hobbes.asm < prev    next >
Assembly Source File  |  1992-08-27  |  18KB  |  722 lines

  1. ; Hobbes
  2. ; Mode X Library
  3. ; Copyright (C) 1992 Court Demas     --  cd2a+@cmu.edu
  4. ; Portions Copyright (C) 1992 Steven Dollins  --  sdollins@uiuc.edu
  5.  
  6. include hobbes.inc
  7.  
  8. ;----------------------------------------------------------------------------
  9. ; Thanks:
  10. ;
  11. ; Michael Abrash -
  12. ;    the almight one
  13. ;
  14. ; Steve Dollins -
  15. ;    Line, Triangle, Text, Palette code
  16. ;
  17. ; Sutty & Blair -
  18. ;    Cool EGA/VGA Book
  19. ;    Panning/Scrolling/Split Screen routines, etc.
  20. ;
  21. ; Frederick J. Haab -
  22. ;    "Scroll" func for viewing virtual screen
  23. ;
  24. ;----------------------------------------------------------------------------
  25.  
  26. .DATA
  27.  
  28.         public  _RowOffset
  29. _RowOffset    dw     1024 dup(?)
  30.  
  31. public _ClipLeft, _ClipTop, _ClipRight, _ClipBottom
  32. _ClipLeft                    dw    0
  33. _ClipTop                    dw  0
  34. _ClipRight                  dw  4Fh
  35. _ClipBottom                 dw  3Fh
  36.  
  37.  
  38. ;Ok, this is a bit much (maybe), but it's the only decent way I know of to
  39. ;handle all of the different possible memory arrangements.  It has to handle
  40. ;different resolutions, split screens, virtual screens, double-buffering,
  41. ;etc.  If you have a better idea, do tell.
  42.  
  43. public _ModeX_Segment, _Draw_Offset, _Display_Offset
  44. _ModeX_Segment                dw    0A000h
  45. _Draw_Offset                dw  00000h
  46. _Display_Offset                dw    00000h
  47.  
  48. public _Split_Line, _Split_Offset, _Page0_Offset, _Page1_Offset
  49. _Split_Line                    dw    240d
  50. _Split_Offset                dw    00000h        ;always 0
  51. _Page0_Offset                dw    00000h
  52. _Page1_Offset                dw    04b00h
  53.  
  54. public _Physical_Width_Addr, _Physical_Height_Addr
  55. public _Physical_Width_Pix, _Physical_Height_Pix
  56. _Physical_Width_Addr        dw    80d
  57. _Physical_Height_Addr        dw    60d
  58. _Physical_Width_Pix            dw    320d
  59. _Physical_Height_Pix        dw    240d
  60.  
  61. public _Virtual_Width_Addr, _Virtual_Height_Addr
  62. public _Virtual_Width_Pix, _Virtual_Height_Pix, _Virtual_Size
  63. _Virtual_Width_Addr            dw     80d
  64. _Virtual_Height_Addr        dw    60d
  65. _Virtual_Width_Pix            dw     320d
  66. _Virtual_Height_Pix            dw     240d
  67. _Virtual_Size                dw    04b00h
  68.  
  69. public _Background_Offset, _Bitmap_Offset, _Pattern_Offset
  70. _Background_Offset          dw    09600h
  71. _Bitmap_Offset                dw    0f000h
  72. _Pattern_Offset                dw    0fffch
  73.  
  74. public _Double_Buffer, _Current_Page
  75. _Double_Buffer                dw    1            ;double-buffer by default
  76. _Current_Page                dw    0
  77.  
  78.  
  79. extrn _MouseSetPage
  80.  
  81. ;----------------------------------------------------------------------------
  82. ; Index/data pairs for CRT Controller registers that differ between
  83. ; mode 13h and mode X.
  84. CRTParms label  word
  85.         dw      00d06h  ;vertical total
  86.         dw      03e07h  ;overflow (bit 8 of vertical counts)
  87.         dw      04109h  ;cell height (2 to double-scan)
  88.         dw      0ea10h  ;v sync start
  89.         dw      0ac11h  ;v sync end and protect cr0-cr7
  90.         dw      0df12h  ;vertical displayed
  91.         dw      00014h  ;turn off dword mode
  92.         dw      0e715h  ;v blank start
  93.         dw      00616h  ;v blank end
  94.         dw      0e317h  ;turn on byte mode
  95. CRT_PARM_LENGTH equ     (($-CRTParms)/2)
  96.  
  97.  
  98.  
  99. .CODE
  100. ;----------------------------------------------------------------------------
  101. ; void Set320x200Mode(void);
  102. ;
  103.     public _Set320x200Mode
  104. _Set320x200Mode proc
  105.         push    bp
  106.         mov        bp,sp
  107.         push    ds
  108.         mov        ax,@data
  109.         mov        ds,ax
  110.  
  111.         mov        ax,320d
  112.         mov        _Physical_Width_Pix,ax
  113.         mov        ax,200d
  114.         mov        _Physical_Height_Pix,ax
  115.         mov        _Split_Line,ax
  116.         mov        ax,80d
  117.         mov        _Physical_Width_Addr,ax
  118.         mov        ax,50d
  119.         mov        _Physical_Height_Addr,ax
  120.  
  121.         mov        ah,0
  122.         mov        al,BYTE PTR [bp+6]
  123.         mov        bl,al
  124.         and        bl,07fh
  125.  
  126. @@setxmode:
  127.         mov        ah,0            ; set 256-color mode
  128.         mov        al,13h
  129.         int        10h
  130.  
  131.         mov        dx,03c4h        ; convert to X-mode addressing
  132.         mov        ax,0604h        ; chain mode off
  133.         out     dx,ax
  134.  
  135.         mov        dx,03d4h
  136.         mov        ax,0014h        ; doubleword off
  137.         out        dx,ax
  138.         mov        ax,0E317h       ; byte mode on
  139.         out        dx,ax
  140.  
  141.         mov        dx,03CEH
  142.         mov        ax,0FF08h       ; all CPU data bits
  143.         out        dx,ax
  144.  
  145.         mov        dx,03c4h        ; prepare plane mask reg. for access
  146.         mov        ax,0f02h
  147.         out        dx,al
  148.  
  149.         mov        ax,WORD PTR[bp+6]
  150.         test    al,080h
  151.         jnz        @@dontclear
  152.  
  153.         mov        ax,0f02h
  154.         out        dx,ax            ; clear all planes at once
  155.         mov        ax,0a000h
  156.         mov        es,ax
  157.         xor        di,di
  158.         mov        cx,0ffffh
  159.         xor        ax,ax
  160.         rep        stosb
  161.  
  162. @@dontclear:
  163.         pop        ds
  164.         pop        bp
  165.         ret
  166. _Set320x200Mode endp
  167.  
  168.  
  169.  
  170. ;----------------------------------------------------------------------------
  171. ; void Set320x240(void);
  172. ;
  173.         public  _Set320x240Mode
  174. _Set320x240Mode proc
  175.         push    ds
  176.         mov        ax,@data
  177.         mov        ds,ax
  178.  
  179.         push    bp
  180.         push    si
  181.         push    di
  182.  
  183.         mov        ax,320d
  184.         mov        _Physical_Width_Pix,ax
  185.         mov        ax,240d
  186.         mov        _Physical_Height_Pix,ax
  187.         mov        _Split_Line,ax
  188.         mov        ax,80d
  189.         mov        _Physical_Width_Addr,ax
  190.         mov        ax,60d
  191.         mov        _Physical_Height_Addr,ax
  192.  
  193.  
  194.         mov     ax,13h  ;let the BIOS set standard 256-color
  195.         int     10h     ; mode (320x200 linear)
  196.         mov     dx,SC_INDEX
  197.         mov     ax,0604h
  198.         out     dx,ax   ;disable chain4 mode
  199.         mov     ax,0100h
  200.         out     dx,ax   ;synchronous reset while switching clocks
  201.         mov     dx,MISC_OUTPUT
  202.         mov     al,0e3h
  203.         out     dx,al   ;select 25 MHz dot clock & 60 Hz scanning rate
  204.         mov     dx,SC_INDEX
  205.         mov     ax,0300h
  206.         out     dx,ax   ;undo reset (restart sequencer)
  207.         mov     dx,CRTC_INDEX ;reprogram the CRT Controller
  208.         mov     al,11h  ;VSync End reg contains register write
  209.         out     dx,al   ; protect bit
  210.         inc     dx      ;CRT Controller Data register
  211.         in      al,dx   ;get current VSync End register setting
  212.         and     al,7fh  ;remove write protect on various
  213.         out     dx,al   ; CRTC registers
  214.         dec     dx      ;CRT Controller Index
  215.         cld
  216.         mov     si,offset CRTParms ;point to CRT parameter table
  217.         mov     cx,CRT_PARM_LENGTH ;# of table entries
  218. @@SetCRTParmsLoop:
  219.         lodsw           ;get the next CRT Index/Data pair
  220.         out     dx,ax   ;set the next CRT Index/Data pair
  221.         loop    @@SetCRTParmsLoop
  222.         mov     dx,SC_INDEX
  223.         mov     ax,0f02h
  224.         out     dx,ax   ;enable writes to all four planes
  225.         mov     ax,_ModeX_Segment ;now clear all display memory, 8 pixels
  226.         mov     es,ax         ; at a time
  227.         sub     di,di   ;point ES:DI to display memory
  228.         sub     ax,ax   ;clear to zero-value pixels
  229.         mov     cx,8000h ;# of words in display memory
  230.         rep     stosw   ;clear all of display memory
  231.         pop     di
  232.         pop     si
  233.         pop     bp
  234.         pop        ds
  235.         ret
  236. _Set320x240Mode endp
  237.  
  238.  
  239.  
  240. ;----------------------------------------------------------------------------
  241. ; void Set320x400(void);
  242. ;
  243.     public _Set320x400Mode
  244. _Set320x400Mode proc far
  245.  
  246.         mov        ax,320d
  247.         mov        _Physical_Width_Pix,ax
  248.         mov        ax,400d
  249.         mov        _Physical_Height_Pix,ax
  250.         mov        _Split_Line,ax
  251.         mov        ax,80d
  252.         mov        _Physical_Width_Addr,ax
  253.         mov        ax,100d
  254.         mov        _Physical_Height_Addr,ax
  255.  
  256.         mov        ax,13h
  257.         int        10h
  258.         mov        dx,SC_INDEX
  259.         mov        al,MEMORY_MODE
  260.         out        dx,al
  261.         inc        dx
  262.         in        al,dx
  263.         and     al,not 08h
  264.         or         al,04h
  265.         out     dx,al
  266.         mov     dx,GC_INDEX
  267.         mov     al,GRAPHICS_MODE
  268.         out     dx,al
  269.         inc     dx
  270.         in         al,dx
  271.         and     al,not 10h
  272.         out     dx,al
  273.         dec     dx
  274.         mov     al,MISCELLANEOUS
  275.         out     dx,al
  276.         inc     dx
  277.         in         al,dx
  278.         and     al,not 02h
  279.         out     dx,al
  280.  
  281. ;CONST_TO_INDEXED_REGISTER SC_INDEX, MAP_MASK, 0fh
  282.         mov        dx,SC_INDEX
  283.         mov        ax,111100000000b + MAP_MASK
  284.         out        dx,al
  285. ;***                   1111
  286.         mov     ax,_ModeX_Segment
  287.         mov     es,ax
  288.         sub     di,di
  289.         mov     ax,di
  290.         mov     cx,8000h
  291.         cld
  292.         rep     stosw
  293.         mov     dx,CRTC_INDEX
  294.         mov     al,MAX_SCAN_LINE
  295.         out     dx,al
  296.         inc     dx
  297.         in         al,dx
  298.         and     al,not 1fh
  299.         out     dx,al
  300.         dec     dx
  301.  
  302.         mov     al,UNDERLINE
  303.         out     dx,al
  304.         inc     dx
  305.         in         al,dx
  306.         and     al,not 40h
  307.         out     dx,al
  308.         dec     dx
  309.         mov     al,MODE_CONTROL
  310.         out     dx,al
  311.         inc     dx
  312.         in         al,dx
  313.         or         al,40h
  314.         out     dx,al
  315.         ret
  316. _Set320x400Mode endp
  317.  
  318.  
  319.  
  320. ;----------------------------------------------------------------------------
  321. ; void _Set360x480Mode()
  322. ;
  323. .code
  324. vptbl    dw    06b00h    ; horz total
  325.         dw    05901h    ; horz displayed
  326.         dw    05a02h    ; start horz blanking
  327.         dw    08e03h    ; end horz blanking
  328.         dw    05e04h    ; start h sync
  329.         dw    08a05h    ; end h sync
  330.         dw    00d06h    ; vertical total
  331.         dw    03e07h    ; overflow
  332.         dw    04009h    ; cell height
  333.         dw    0ea10h    ; v sync start
  334.         dw    0ac11h    ; v sync end and protect cr0-cr7
  335.         dw    0df12h    ; vertical displayed
  336.         dw    02d13h    ; offset
  337.         dw    00014h    ; turn off dword mode
  338.         dw    0e715h    ; v blank start
  339.         dw    00616h    ; v blank end
  340.         dw    0e317h    ; turn on byte mode
  341. vpend    label    word
  342.  
  343.  
  344.     public _Set360x480Mode
  345. _Set360x480Mode proc
  346.         push    ds
  347.         mov        ax,cs
  348.         mov        ds,ax
  349.  
  350.         push    ds
  351.         mov        ax,@data
  352.         mov        ds,ax
  353.  
  354.         mov        ax,360d
  355.         mov        _Physical_Width_Pix,ax
  356.         mov        ax,480d
  357.         mov        _Physical_Height_Pix,ax
  358.         mov        _Split_Line,ax
  359.         mov        ax,90d
  360.         mov        _Physical_Width_Addr,ax
  361.         mov        ax,120d
  362.         mov        _Physical_Height_Addr,ax
  363.  
  364.         pop        ds
  365.  
  366.         mov        ax,13h        ; start with standard mode 13h
  367.         int        10h            ; let the bios set the mode
  368.  
  369.         mov        dx,3c4h        ; alter sequencer registers
  370.         mov        ax,0604h    ; disable chain 4
  371.         out        dx,ax
  372.  
  373.         mov        ax,0f02h    ; set write plane mask to all bit planes
  374.         out        dx,ax
  375.         push    di
  376.         xor        di,di
  377.         mov        ax,0a000h    ; screen starts at segment A000
  378.         mov        es,ax
  379.         mov        cx,21600    ; ((XSIZE*YSIZE)/(4 planes))/(2 bytes per word)
  380.         xor        ax,ax
  381.         cld
  382.         rep        stosw        ; clear the whole of the screen
  383.         pop        di
  384.  
  385.         mov        ax,0100h    ; synchronous reset
  386.         out        dx,ax        ; asserted
  387.         mov        dx,3c2h        ; misc output
  388.         mov        al,0e7h        ; use 28 mHz dot clock
  389.         out        dx,al        ; select it
  390.         mov        dx,3c4h        ; sequencer again
  391.         mov        ax,0300h    ; restart sequencer
  392.         out        dx,ax        ; running again
  393.  
  394.         mov        dx,3d4h        ; alter crtc registers
  395.  
  396.         mov        al,11h        ; cr11
  397.         out        dx,al        ; current value
  398.         inc        dx            ; point to data
  399.         in        al,dx        ; get cr11 value
  400.         and        al,7fh        ; remove cr0 -> cr7
  401.         out        dx,al        ;    write protect
  402.         dec        dx            ; point to index
  403.         cld
  404.         mov        si,offset vptbl
  405.         mov        cx,((offset vpend)-(offset vptbl)) shr 1
  406. @@outlp:
  407.         lodsw
  408.         out        dx,ax
  409.         loop    @@outlp
  410.         pop        ds
  411.         ret
  412. _Set360x480Mode endp
  413.  
  414.  
  415.  
  416. ;----------------------------------------------------------------------------
  417. ; void _WaitForRetrace(void)
  418. ;
  419.     public _WaitForRetrace
  420. _WaitForRetrace proc
  421.         mov     dx,03dah
  422. @@swap_retr1:
  423.         in      al,dx
  424.         test    al,8
  425.         jnz     @@swap_retr1
  426. @@swap_retr2:
  427.         in      al,dx
  428.         test    al,8
  429.         jz      @@swap_retr2
  430.         ret
  431. _WaitForRetrace endp
  432.  
  433.  
  434.  
  435.  
  436. ;----------------------------------------------------------------------------
  437. ; void SetClipPort(int LEFT, int TOP, int RIGHT, int Bottom)
  438. ;
  439.         public  _SetClipPort
  440. _SetClipPort proc
  441. ARG    LEFT:WORD, TOP:WORD, RIGHT:WORD, BOTTOM:WORD
  442.         push    bp
  443.         mov     bp,sp
  444.         push    ds
  445.         mov     ax,@data
  446.         mov     ds,ax
  447.  
  448.         mov     ax,LEFT
  449.         mov     _ClipLeft,ax
  450.         mov     ax,TOP
  451.         mov     _ClipTop,ax
  452.         mov     ax,RIGHT
  453.         mov     _ClipRight,ax
  454.         mov     ax,BOTTOM
  455.         mov     _ClipBottom,ax
  456.  
  457.         pop     ds
  458.         pop     bp
  459.         ret
  460. _SetClipPort        endp
  461.  
  462.  
  463.  
  464. ;----------------------------------------------------------------------------
  465. ; void ShowPage( VRAM_PTR startoffset )
  466. ;
  467.         public  _ShowPage
  468. _ShowPage proc
  469. ARG StartOffsetHigh:BYTE:1, StartOffsetLow:BYTE:1
  470.         push    bp
  471.         mov     bp,sp
  472.  
  473.         push     ds
  474.         mov        ax,@data
  475.         mov        ds,ax
  476.  
  477.         ; Wait for display enable to be active (status is active low), to be
  478.         ; sure both halves of the start address will take in the same frame.
  479.         mov     bl,START_ADDRESS_LOW        ;preload for fastest
  480.         mov        bh,StartOffsetLow           ; flipping once display
  481.         mov     cl,START_ADDRESS_HIGH       ; enable is detected
  482.         mov        ch,StartOffsetHigh
  483.         mov     dx,INPUT_STATUS_1
  484. @@WaitDE:
  485.         in      al,dx
  486.         test    al,01h
  487.         jnz     @@WaitDE  ;display enable is active low (0 = active)
  488.         ; Set the start offset in display memory of the page to display.
  489.         mov     dx,CRTC_INDEX
  490.         mov     ax,bx
  491.         out     dx,ax   ;start address low
  492.         mov     ax,cx
  493.         out     dx,ax   ;start address high
  494.  
  495.         ; Now wait for vertical sync, so the other page will be invisible when
  496.         ; we start drawing to it.
  497.         mov     dx,INPUT_STATUS_1
  498. @@WaitVS:
  499.         in      al,dx
  500.         test    al,08h
  501.         jz      @@WaitVS  ;vertical sync is active high (1 = active)
  502.  
  503.         pop        ds
  504.         pop     bp
  505.         ret
  506. _ShowPage       endp
  507.  
  508.  
  509.  
  510. ;----------------------------------------------------------------------------
  511. ; void SetDisplay(int x0, int y0);
  512. ;
  513.  
  514.  
  515.     public _SetDisplay
  516. _SetDisplay proc far
  517. ARG x:word,y:word
  518.         push    bp
  519.         mov     bp,sp
  520.         push    ds
  521.         mov        ax,@data
  522.         mov        ds,ax
  523.  
  524.         mov     ax,[_Virtual_Width_Addr] ; Calculate Offset increment
  525.         mul     [y]                     ; for Y
  526.         add     ax,_Display_Offset      ; add it to Start offset
  527.         add     ax,[x]                  ; add the column offset for X
  528.  
  529.         mov     bh,al                   ; setup CRTC start addr regs and
  530.                                         ; values in word registers for
  531.         mov     ch,ah                   ; fast word outs
  532.  
  533.  
  534. @@StartAddrEntry:
  535.         mov     bl,START_ADDRESS_LOW
  536.         mov     cl,START_ADDRESS_HIGH
  537.  
  538.         call    _WaitForRetrace
  539.  
  540.         mov     dx,CRTC_INDEX
  541.         mov     ax,bx
  542.         out     dx,ax   ;start address low
  543.         mov     ax,cx
  544.         out     dx,ax   ;start address high
  545.  
  546.         pop        ds
  547.         pop     bp
  548.         ret
  549. _SetDisplay   endp
  550.  
  551.  
  552.  
  553. ;----------------------------------------------------------------------------
  554. ; void SetSplit(unsigned int Addr);
  555. ;
  556. ; Mode X (320x240, 256 colors) Set 320x240 mode split screen starting row
  557. ; The split screen resides on the bottom half of the screen and has a
  558. ; starting address of A000:0000
  559. ;
  560. ; C near-callable as:
  561. ;
  562. ; Updates _MainScrnOffset to reflect the existence of the split screen region
  563. ; ie -MainScrnOffset is set to the offset of the first pixel beyond the split
  564. ; screen region
  565. ;
  566.  
  567.     public _SetSplit
  568. _SetSplit proc far
  569. ARG Line:word
  570.         push    bp
  571.         mov     bp,sp       ; set up stack frame
  572.         push    di
  573.  
  574.         mov     ax,[Line]
  575.         mov        _Split_Line,ax
  576.         mov        bx,_Virtual_Height_Pix
  577.         sub        bx,ax
  578.         mov        di,ax
  579.         shl        di,1
  580.         mov        di,word ptr _RowOffset[di]
  581.         add        _Page0_Offset,di
  582.         add        _Page1_Offset,di
  583.         add        _Display_Offset,di
  584.         add        _Draw_Offset,di
  585.  
  586.         dec     ax          ; Don't ask me why. It works this way !!
  587.         jns     @@NotNeg    ; Check that Split Scrn start scan line is +ve
  588.  
  589.         mov     ax,0        ; Since -ve set to 0
  590.  
  591. @@NotNeg:
  592.         push    ax          ; Save the decremented start scam line
  593.         shl     ax,1        ; Mode X is actually composed of 480 scan lines
  594.                             ; so for start scanline multiply required ModeX
  595.                             ; scan line by 2
  596.  
  597.         mov     [Line],ax   ; save the scanline
  598.  
  599.         call     _WaitForRetrace        ; wait for vertical retrace
  600.  
  601.         mov     dx,CRTC_INDEX
  602.         mov     ah,byte ptr [Line]
  603.         mov     al,LINE_COMPARE
  604.  
  605.         cli                  ; Dont allow register setting to be interrupted
  606.  
  607.         out     dx,ax        ; Bits 7-0 of the split screen scan line
  608.  
  609.         mov     ah,byte ptr [Line+1]
  610.         and     ah,1
  611.         mov     cl,4
  612.         shl     ah,cl
  613.         mov     al,OVERFLOW  ; Bit 4 of overflow register = Bit 8 of split
  614.         out     dx,al        ; screen scan line,
  615.         inc     dx           ; So using readability of VGA registers
  616.         in      al,dx        ; Read the OVERFLOW register, and set the
  617.         and     al, not 10h  ; bit corresponding to Bit 8 (above)
  618.         or      al,ah
  619.         out     dx,al
  620.  
  621.         dec     dx
  622.         mov     ah,byte ptr [Line+1]
  623.         and     al,2
  624.         mov     cl,3
  625.         ror     ah,cl
  626.         mov     al,MAX_SCAN_LINE  ; Bit 6 of max scan line register =
  627.         out     dx,al             ; Bit 9 of split screen scan line
  628.         inc     dx                ; As we did before, update the apropriate
  629.         in      al,dx             ; bit without disturbing the rest
  630.         and     al, not 40h
  631.         or      al,ah
  632.         out     dx,al
  633.         sti                  ; Registers are set, so interrupts are safe
  634.  
  635.         pop     ax                    ; Determine where the first byte
  636.         sub     ax,_Physical_Height_Pix ;PHYSICAL_HEIGHT of the non split screen video ram
  637.         neg     ax                    ; starts and store it for future
  638.         mov     bx,_Virtual_Width_Addr ;[_ScrnLogicalByteWidth]  ; reference
  639.         mul     bx
  640.         mov     _Draw_Offset,ax
  641.  
  642.         ; calculate no. non split screen rows in video ram
  643.         mov     cx,0ffffh             ; cx = Maximum video ram offset
  644.         sub     cx,ax                 ; cx = cx - _MainScrnOfs
  645.         xchg    cx,ax                 ; swap cx and ax
  646.         sub     dx,dx                 ; DX:AX is divide operand,  set DX = 0
  647.         div     bx                    ; divide ax (prev cx) by
  648.                                       ; ScrnLogicalByteWidth
  649.  
  650.         mov     _Virtual_Height_Addr,ax ;[_ScrnLogicalHeight],ax  ; Save Screen Logical Height
  651.         sub     ax,_Physical_Height_Pix ;PHYSICAL_HEIGHT Update the maximum Y position of
  652. ;        mov     [_MaxScrollY],ax         ; Physical screen in logical screen
  653.         xchg    cx,ax                 ; restore original ax (MainScrnOfs)
  654.  
  655. ;        mov     bh,al                 ; Set the visible screen start address
  656. ;        mov     ch,ah                 ; to the top left corner of the virtual
  657. ;        jmp     short StartAddrEntry  ; screen
  658.  
  659.         pop        di
  660.         pop        bp
  661.         ret
  662. _SetSplit  endp
  663.  
  664.  
  665.  
  666. ;----------------------------------------------------------------------------
  667. ;  void FlipPage(void);
  668. ;
  669. ; SWAP(Display,Draw);
  670. ; Show(Display);
  671. ;
  672. extrn _MousePage_Offset
  673.  
  674.         public  _FlipPage
  675. _FlipPage proc
  676.         push    ds
  677.         mov     ax,@data
  678.         mov     ds,ax
  679.  
  680.         mov        cx,_Page0_Offset
  681.         mov        dx,_Page1_Offset
  682.         cmp        _Current_Page,0
  683.         je        @@setpage1
  684.  
  685. @@setpage0:
  686.         mov        _Current_Page,0
  687.         mov        _Display_Offset,cx
  688.         mov        _Draw_Offset,dx
  689.         jmp        short @@end
  690. @@setpage1:
  691.         mov        _Current_Page,1
  692.         mov        _Display_Offset,dx
  693.         mov        _Draw_Offset,cx
  694. @@end:
  695.         mov        ax,_Draw_Offset
  696.         mov        _MousePage_Offset,ax
  697.         mov        ax,_Display_Offset
  698. ;        call    far ptr _MouseSetPage
  699.         push    ax
  700.         call    _ShowPage
  701.         pop        ax
  702.  
  703.         pop     ds
  704.         ret
  705. _FlipPage       endp
  706.  
  707.  
  708.  
  709. ;----------------------------------------------------------------------------
  710. ; void RestoreTextMode( void )
  711.  
  712.         public  _RestoreTextMode
  713. _RestoreTextMode proc
  714.         mov     ax,0003h        ; set text mode
  715.         int     10h
  716.         ret
  717. _RestoreTextMode endp
  718.  
  719.  
  720. ;----------------------------------------------------------------------------
  721. END
  722.